﻿/******************************************************************************
* File description: animationController_Shifting.h
* Function: 转靶动画Controller，基于State的状态，根据时间计算当前动画的过渡状态，并提供获取当前状态的接口
* Current Version: 1.0.0
* Author: JNN
* Date: 2025-07-01
*  -----
*  Copyright by 博坤生物 .
 *****************************************************************************/

#ifndef ANIMATIONCONTROLLER_SHIFTING_H
#define ANIMATIONCONTROLLER_SHIFTING_H

#include "animationState_Shifting.h"
#include <QTimer>
#include <QVariantMap>
#include "StaticProperties.h"

#define AS_S AnimationState_Shifting


class AnimationController_Shifting : public QObject
{
    Q_OBJECT
public:
    AnimationController_Shifting(AnimationState_Shifting* state);

    void            startTimer();
    void            stopTimer();
    QVariantMap     requestInfo();

    void            teleportX(int idx);
    void            teleportZ(int idx);

    void            refreshBarPosiByMachineType(int type);     // 机型变化时，重定bar的位置


public slots:
    void            updateState(double interval = -1);      // 状态计算更新 (Timer调用)
    void            reset();


private:


    AnimationState_Shifting* _state = nullptr;

    AS_S::emBarState      _curBarOp = AS_S::EMPTY;

    QTimer*         _timer = nullptr;
    double          _interval = 33;

    // 上面的那个杆
    double          _barPosi = 0;               // 开盖和取靶那个杆的位置，0在最左，1在最右
    int             _barState = 0;
    // 开盖器
    double          _capCranePosi = 0;          // 上下位置 0最上面 1最下面
    int             _capCraneState = 0;         // 状态 0灰 1运行 -1故障
    double          _capCraneClampState = 0;    // 0松开 1夹紧
    // 吸靶器
    double          _targetCranePosi = 0;       // 上下位置 0最上面 1最下面
    int             _targetCraneState = 0;      // 状态
    // 活检器
    double          _radioBarPosi = 0;         // 上下位置 0最上面 1最下面

    // 瓶盖
    int             _targetBottleCapPosi = 0;   // 瓶盖在哪 0在罐子里 1在取盖器上
    int             _targetBottleCapState = 0;  // 盖子的颜色
    double          _targetBottleCapAngle = 0;              // 0-0.999关盖（盖子在罐子上） 1开盖（盖子在取盖器上）

    // 瓶身
    int             _targetBottleBodyState = 0;

    // 夹爪
    double          _clampPosi = 0;         // 1夹紧 0松开
    int             _clampState = 0;
    // 进料口
    double          _feedPortState = 0;
    // 挡板
    double          _bafflePosi = 0;        // 1挡住 0不挡
    double          _baffleState = 0;
    // 产物瓶
    int             _productBottleState = 0;

    // 会转圈的吸盘
    double          _suckAngle = 0;


    QVector<int>    _bulbState = {0, 0, 0, 0};


    QVector<int>    _bultBalse = {1, 2, 4};


    // 一些位置

    double          BAR_POSI_ORI   = 0.000;        // 原点
    double          BAR_POSI_CAP   = 0.690;        // 开盖（开盖器对准靶材罐
    double          BAR_POSI_TAR1  = 0.342;        // 吸靶（吸盘对准靶材罐
    double          BAR_POSI_TAR2  = 0.690;        // 放靶（吸盘对准溶靶罐
    double          BAR_POSI_RADIO = 0.342;        // 活检（吸盘对准活检



};

#endif // ANIMATIONCONTROLLER_SHIFTING_H
